import os
import jinja2
from docxtpl import DocxTemplate,InlineImage,RichText
from docx.shared import Mm


# 自定义jinja2过滤器percent_format，格式化输出百分比，保留2位小数
def percent_format(value):
    return '{:.2%}'.format(value)

# 自定义jinja2过滤器float_format，格式化输出float类型数值，保留2位小数
def float_format(value):
    if value is None or isinstance(value, str) and not value.strip():
        return '0.00'
    try:
        return '{:.2f}'.format(float(value))
    except (ValueError, TypeError):
        return '0.00'

# 自定义jinja2过滤器date2str_format，将字符串datetime"yyyy-mm-dd 00:00:00"格式化输出为"yyyy-mm-dd"字符串格式
def date2str_format(value):
    return value.strip('00:00:00')

# 自定义jinja2过滤器date2str_format，将datetime格式化输出为"yyyy-mm-dd"字符串格式
def datetime2str_format(value):
    return value.strftime('%Y-%m-%d')

#自动生成评估报告
def generate_report(report_tpl_file,context,save_dir):
    company_name = context['company_name']
    # report_tpl为报告模板
    report_tpl = DocxTemplate(report_tpl_file)

    # 将自定义过滤器传入jinja2.Environment
    jinja_env = jinja2.Environment()
    jinja_env.filters['percent_format'] = percent_format
    jinja_env.filters['float_format'] = float_format
    jinja_env.filters['date2str_format'] = date2str_format
    jinja_env.filters['datetime2str_format'] = datetime2str_format

    # 填充context数据到模板文件中
    report_tpl.render(context,jinja_env)

    temp_file = os.path.join(save_dir,f'temp_file_{company_name}.docx')
    report_tpl.save(temp_file)   
    
    # report_tpl为报告模板
    report_tpl = DocxTemplate(temp_file)
    
    #图片渲染字典
    image_context = {}
    
    #生成插入图片的context
    for pro_code,image_path in context['image'].items():
        insert_image = InlineImage(report_tpl,image_descriptor=image_path,width=Mm(100),height=Mm(90))
        image_context.update({pro_code+'_image':insert_image})
        
    #将图片插入模板    
    report_tpl.render(image_context)

    #保存生成的报告文档
    report_file = os.path.join(save_dir,company_name+'评估报告.docx')
    report_tpl.save(report_file)
    os.remove(temp_file)
    for pro_code,image_path in context['image'].items():
        os.remove(image_path)
    os.rmdir(context['image_dir'])